Contents
  1. 1. Animal.java:
  2. 2. Dog.java:
  3. 3. Cat.java:
  4. 4. Generator.java:

Animal.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package lianxi;

public class Animal {
String name;

public Animal(){ }


public Animal(String name){
setName(name);
}

public String getName(){
return name;
}

public void setName(String name){
this.name = name;
}

public String toString(){
return "My name is " + name;
}
}

Dog.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package lianxi;

public class Dog extends Animal{
private static long count = 0;

private final long id = count++;

public Dog(){
super("default");
}

public Dog(String name){
super(name);
}

@Override
public String getName(){
return super.getName();
}

@Override
public void setName(String name){
super.setName(name);
}

public String toString(){
return getClass().getSimpleName() + " " + super.name + " " + id;
}
}

Cat.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package lianxi;

public class Cat extends Animal{
private static long count = 0;

private final long id = count++;

public Cat(){
super("default");
}

public Cat(String name){
super(name);
}

@Override
public String getName(){
return super.getName();
}

@Override
public void setName(String name){
super.setName(name);
}

@Override
public String toString(){
return getClass().getSimpleName() + " " + super.name + " " + id;
}
}

Generator.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package lianxi;

public interface Generator<T> {
T RandomNext();
}

AnimalGenerator.java:
package lianxi;

import java.util.Iterator;
import java.util.Random;

//支持foreach迭代循环的学生集合类要继承Iterable接口
public class AnimalGenerator implements Generator<Animal>, Iterable<Animal>{
//存储动物的种类
private Class[] types = {Dog.class, Cat.class};

private static Random rand = new Random(47);

public AnimalGenerator() {}

//For Generator Interface
@Override
public Animal RandomNext() {
try{//返回一个随机动物种类的实例
return (Animal)types[rand.nextInt(types.length)].newInstance();
}catch(Exception e){
throw new RuntimeException(e);
}
}

//For Iterable:
//实现了Iterable接口,所以可以用foreach,不过需要一个末尾哨兵给内部类的count用,所以实现了第2个构造器
private int size = 0;

public AnimalGenerator(int size){
this.size = size;
}

@Override
public Iterator<Animal> iterator(){
return new AnimalIterator();
}
//内部类,随机生成Animal的种类的 迭代器
private class AnimalIterator implements Iterator<Animal>{

private int count = size;

@Override
public boolean hasNext() {
return count > 0;
}

@Override
public Animal next() {
count--;
return AnimalGenerator.this.RandomNext();
}

@Override
public void remove(){
throw new UnsupportedOperationException();
}
}

public static void main(String[] args){

AnimalGenerator gen = new AnimalGenerator();

for(int i = 0; i < 5; i++){
System.out.println(gen.RandomNext());
}
System.out.println("-------------------");
for(Animal a : new AnimalGenerator(5)){
System.out.println(a);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
输出:
Cat default 0
Dog default 0
Cat default 1
Dog default 1
Dog default 2
-------------------
Cat default 2
Dog default 3
Dog default 4
Cat default 3
Cat default 4
Contents
  1. 1. Animal.java:
  2. 2. Dog.java:
  3. 3. Cat.java:
  4. 4. Generator.java: